package com.example.common_utils.buildTree;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

/*
 * 构建前端需要下拉树结构
 * */
public class BuildMenuTreeSelect {
    /**
     * 建前端所需要下拉树结构
     *
     * @param menus
     * @return
     */
    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) {
        List<SysMenu> sysMenus = buildMenuTree(menus);
        return sysMenus.stream().map(TreeSelect::new).collect(Collectors.toList());
    }

    /**
     * 构建前端所需要树结构
     *
     * @param menus
     * @return
     */
    public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
        // 1. 新建返回结果returnList 和 tempList
        List<SysMenu> returnList = new ArrayList<SysMenu>();
        List<Long> tempList = new ArrayList<Long>();
        // 2. 遍历menus，然后tempList中add所有的菜单id
        for (SysMenu menu : menus) {
            tempList.add(menu.getMenuId());
        }
        for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext(); ) {
            SysMenu menu = (SysMenu) iterator.next();
            // 如果是顶级节点，遍历该父节点的所有子节点  因为如果是顶级菜单，那么对应的parentId不在tempList中
            // 如果对应的parentId在tempList中，那么表明这个不是顶级菜单，一定在某个顶级菜单的下面
            if (!tempList.contains(menu.getParentId())) {
                recursionFn(menus, menu);
                returnList.add(menu);
            }
        }
        // 如果为null，没有做对应的树形结构的分层，因此返回的是menus即可
        if (returnList.isEmpty()) {
            returnList = menus;
        }
        // 返回最后的树形结构
        return returnList;
    }

    /**
     * 递归列表
     *
     * @param menus
     * @param menu
     */
    public void recursionFn(List<SysMenu> menus, SysMenu menu) {
        // 得到子节点列表
        List<SysMenu> childList = getChildList(menus, menu);
        menu.setChildren(childList);
        for (SysMenu m : childList) {
            if (hasChild(menus, m)) {
                recursionFn(menus, m);
            }
        }
    }

    /**
     * 得到子节点列表 如果子节点列表存在，那么返回对应的子节点的列表，如果子节点列表不存在，那么返回为null
     *
     * @param menus
     * @param menu
     * @return
     */
    public List<SysMenu> getChildList(List<SysMenu> menus, SysMenu menu) {
        // 将当前对应的菜单的子菜单全部查找出来
        List<SysMenu> subMenus = new ArrayList<SysMenu>();
        Iterator<SysMenu> iterator = menus.iterator();
        while (iterator.hasNext()) {
            SysMenu n = (SysMenu) iterator.next();
            if (n.getParentId().longValue() == menu.getMenuId().longValue()) {
                subMenus.add(n);
            }
        }
        return subMenus; // 如果没有子菜单的值，那么返回的是一个null的值
    }

    /**
     * 判断是否有子节点存在
     *
     * @param menus
     * @param menu
     * @return
     */
    private boolean hasChild(List<SysMenu> menus, SysMenu menu) {
        return getChildList(menus, menu).size() > 0 ? true : false;
    }
}
